From 68c6f2b039dd563bf75f199110857e3566025f1f Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 17 Dec 2016 12:37:38 +0300 Subject: [PATCH] Be more explicit about temporary workspaces --- src/cargo/core/registry.rs | 3 +-- src/cargo/core/workspace.rs | 14 ++++++++++++-- src/cargo/ops/cargo_install.rs | 2 +- src/cargo/ops/cargo_package.rs | 2 +- src/cargo/ops/resolve.rs | 12 ++++-------- 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/cargo/core/registry.rs b/src/cargo/core/registry.rs index ff4a6219d..292a662ce 100644 --- a/src/cargo/core/registry.rs +++ b/src/cargo/core/registry.rs @@ -153,8 +153,7 @@ impl<'cfg> PackageRegistry<'cfg> { self.add_source(source, Kind::Locked); } - fn add_source(&mut self, source: Box, - kind: Kind) { + fn add_source(&mut self, source: Box, kind: Kind) { let id = source.source_id().clone(); self.sources.insert(source); self.source_ids.insert(id.clone(), (id, kind)); diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs index c396755e8..870733f96 100644 --- a/src/cargo/core/workspace.rs +++ b/src/cargo/core/workspace.rs @@ -40,6 +40,10 @@ pub struct Workspace<'cfg> { // paths. The packages themselves can be looked up through the `packages` // set above. members: Vec, + + // True, if this is a temporary workspace created for the purposes of + // cargo install or cargo package. + is_ephemeral: bool, } // Separate structure for tracking loaded packages (to avoid loading anything @@ -94,6 +98,7 @@ impl<'cfg> Workspace<'cfg> { root_manifest: None, target_dir: target_dir, members: Vec::new(), + is_ephemeral: false, }; ws.root_manifest = ws.find_root(manifest_path)?; ws.find_members()?; @@ -110,8 +115,8 @@ impl<'cfg> Workspace<'cfg> { /// /// This is currently only used in niche situations like `cargo install` or /// `cargo package`. - pub fn one(package: Package, config: &'cfg Config, target_dir: Option) - -> CargoResult> { + pub fn ephemeral(package: Package, config: &'cfg Config, target_dir: Option) + -> CargoResult> { let mut ws = Workspace { config: config, current_manifest: package.manifest_path().to_path_buf(), @@ -122,6 +127,7 @@ impl<'cfg> Workspace<'cfg> { root_manifest: None, target_dir: None, members: Vec::new(), + is_ephemeral: true, }; { let key = ws.current_manifest.parent().unwrap(); @@ -209,6 +215,10 @@ impl<'cfg> Workspace<'cfg> { } } + pub fn is_ephemeral(&self) -> bool { + self.is_ephemeral + } + /// Finds the root of a workspace for the crate whose manifest is located /// at `manifest_path`. /// diff --git a/src/cargo/ops/cargo_install.rs b/src/cargo/ops/cargo_install.rs index f6715992f..351e841a0 100644 --- a/src/cargo/ops/cargo_install.rs +++ b/src/cargo/ops/cargo_install.rs @@ -92,7 +92,7 @@ pub fn install(root: Option<&str>, }; let ws = match overidden_target_dir { - Some(dir) => Workspace::one(pkg, config, Some(dir))?, + Some(dir) => Workspace::ephemeral(pkg, config, Some(dir))?, None => Workspace::new(pkg.manifest_path(), config)?, }; let pkg = ws.current()?; diff --git a/src/cargo/ops/cargo_package.rs b/src/cargo/ops/cargo_package.rs index c837e0156..e27646d9f 100644 --- a/src/cargo/ops/cargo_package.rs +++ b/src/cargo/ops/cargo_package.rs @@ -283,7 +283,7 @@ fn run_verify(ws: &Workspace, tar: &File, opts: &PackageOpts) -> CargoResult<()> let new_pkg = Package::new(new_manifest, &manifest_path); // Now that we've rewritten all our path dependencies, compile it! - let ws = Workspace::one(new_pkg, config, None)?; + let ws = Workspace::ephemeral(new_pkg, config, None)?; ops::compile_ws(&ws, None, &ops::CompileOptions { config: config, jobs: opts.jobs, diff --git a/src/cargo/ops/resolve.rs b/src/cargo/ops/resolve.rs index 76e5e2a0e..61f25d23d 100644 --- a/src/cargo/ops/resolve.rs +++ b/src/cargo/ops/resolve.rs @@ -14,7 +14,7 @@ use util::{profile, human, CargoResult, ChainError}; /// lockfile. pub fn resolve_ws<'a>(ws: &Workspace<'a>) -> CargoResult<(PackageSet<'a>, Resolve)> { let mut registry = PackageRegistry::new(ws.config())?; - let resolve = resolve_with_registry(ws, &mut registry, true)?; + let resolve = resolve_with_registry(ws, &mut registry)?; let packages = get_resolved_packages(&resolve, registry); Ok((packages, resolve)) } @@ -33,17 +33,13 @@ pub fn resolve_ws_precisely<'a>(ws: &Workspace<'a>, }).map(|s| s.to_string()).collect::>(); let mut registry = PackageRegistry::new(ws.config())?; - - // Avoid writing a lockfile if we are `cargo install`ing a non local package. - let write_lockfile = source.is_none() || ws.current_opt().is_none(); - if let Some(source) = source { registry.add_preloaded(source); } // First, resolve the root_package's *listed* dependencies, as well as // downloading and updating all remotes and such. - let resolve = resolve_with_registry(ws, &mut registry, write_lockfile)?; + let resolve = resolve_with_registry(ws, &mut registry)?; // Second, resolve with precisely what we're doing. Filter out // transitive dependencies if necessary, specify features, handle @@ -80,14 +76,14 @@ pub fn resolve_ws_precisely<'a>(ws: &Workspace<'a>, Ok((packages, resolved_with_overrides)) } -fn resolve_with_registry(ws: &Workspace, registry: &mut PackageRegistry, write_lockfile: bool) +fn resolve_with_registry(ws: &Workspace, registry: &mut PackageRegistry) -> CargoResult { let prev = ops::load_pkg_lockfile(ws)?; let resolve = resolve_with_previous(registry, ws, Method::Everything, prev.as_ref(), None, &[])?; - if write_lockfile { + if !ws.is_ephemeral() { ops::write_pkg_lockfile(ws, &resolve)?; } Ok(resolve) -- 2.30.2